关于python:合并两个Pandas数据框时出现MemoryError 您所在的位置:网站首页 python merge报错 关于python:合并两个Pandas数据框时出现MemoryError

关于python:合并两个Pandas数据框时出现MemoryError

2023-09-14 22:43| 来源: 网络整理| 查看: 265

我几乎在整个互联网上进行搜索,但对于我来说,这些方法似乎都不起作用。

我有两个很大的csv文件(每个都有一百万行,大小约为300-400MB)。它们可以使用read_csv函数很好地加载到数据帧中,而不必使用chunksize参数。 我什至对这些数据执行了一些次要的操作,例如新的列生成,过滤等。

但是,当我尝试合并这两个框架时,出现MemoryError。我什至尝试使用SQLite完成合并,但徒劳无功。该操作需要永远。

Mine是具有8GB RAM的Windows 7 PC。 Python版本是2.7

谢谢。

编辑:我也尝试了分块方法。当我这样做时,我没有得到MemoryError,但是RAM使用率激增并且我的系统崩溃了。

相关讨论 您正在使用什么代码来合并它们? merge_df = pandas.merge(df1,df2,left_on =" Colname1",right_on =" Colname2") 您是否正在使用64位版本的Python? 是。我正在使用64位Python 2.7。当前,我的系统上安装了Anaconda 4.3(带有Spyder 3)。 您可以粘贴每个数据框的前几行吗?可能是,您执行的合并操作与预期的操作不同。 (根据我的经验,大多数涉及小于1GB数据帧的联接操作会在几秒钟的时间内完成,但这当然取决于联接的类型以及数据的结构。) 抱歉,这是机密数据。您能否解释一下您的陈述:"您正在执行的合并操作与预期的操作不同"。是的,即使我以前也处理过较大的文件。这就是为什么我对这个问题一无所知。 假设您有一个包含十行的数据集,其中有5行的值是'A',在连接列中有5行是'B'。如果您将此数据集与其自身连接在此连接列上,则结果将有50行,或者是其5倍。有可能您应该加入其他一些列,但忘了包括在内。 谢谢您的解释,肯。但是,我不认为这是问题所在,因为我确保两个连接列都具有唯一值。 您说得对,@ KenWei在为我的加入专栏创建不同的值时,我犯了一个大错误。

使用pandas.merge合并数据时,它将使用df1内存,df2内存和merge_df内存。我相信这就是为什么您遇到内存错误的原因。您应该将df2导出到一个csv文件,并使用chunksize选项并合并数据。

这可能是更好的方法,但是您可以尝试一下。 *对于大数据集,可以在pandas.read_csv

中使用chunksize选项

12345678910111213141516171819202122df1 = pd.read_csv("yourdata.csv") df2 = pd.read_csv("yourdata2.csv") df2_key = df2.Colname2 # creating a empty bucket to save result df_result = pd.DataFrame(columns=(df1.columns.append(df2.columns)).unique()) df_result.to_csv("df3.csv",index_label=False) # save data which only appear in df1 # sorry I was doing left join here. no need to run below two line. # df_result = df1[df1.Colname1.isin(df2.Colname2)!=True] # df_result.to_csv("df3.csv",index_label=False, mode="a") # deleting df2 to save memory del(df2) def preprocess(x):     df2=pd.merge(df1,x, left_on ="Colname1", right_on ="Colname2")     df2.to_csv("df3.csv",mode="a",header=False,index=False) reader = pd.read_csv("yourdata2.csv", chunksize=1000) # chunksize depends with you colsize [preprocess(r) for r in reader]

这会将合并的数据另存为df3。

相关讨论 是的,如果您想进行内部联接,则无需保存#仅出现在df1中的数据df_result = df1 [df1.Colname1.isin(df2.Colname2)!= True] df_result.to_csv(" df3.csv", index_label = False,mode =" a") 我认为缺少创建df2.csv文件的语句。 抱歉,您只需要使用chunksize选项加载" yourdata2.csv" 1.在运行循环之前,是否已使用del(object)释放了所有不必要的对象? 2.如果可以的话,您是否可以尝试使用df2的几行和df1的所有行?*以防万一您连接正确的行并检查结果是否符合预期。 我以前用过大块的东西,智博。我的错。我正在尝试使用较小的块(如您所建议的1000个),并且我目前正在等待输出。谢谢。 希望它能起作用!顺便说一句,我认为您可以使用10000或更多(但是取决于列数...) 在循环的每次迭代中,您都将df2的块大小与完整的df1合并吗?那不是过度吗?在预处理功能中,我也将df df3称为。 这个答案为我节省了很多时间和精力。谢谢! 为什么此分配df2_key = df2.Colname2 您忘记了df3分配吗?

之所以会得到MemoryError: Unable to allocate..的原因可能是由于数据框中的重复项或空白。检查您要加入的列(使用合并时),查看是否有重复或空白。如果是这样,请使用以下命令清除它们:

1df.drop_duplicates(subset ='column_name', keep = False, inplace = True)

然后重新运行您的python / pandas代码。这对我有用。

相关讨论 好一个!一些变种或这也对我有用。实际上索引中有重复项,因为在上一步中必须将ms时间戳取整为s。

@T_cat建议的一般块版本效果很好。

但是,内存爆炸可能是由于联接具有Nan值的列而引起的。 因此,您可能要从联接中排除那些行。

请参阅:https://github.com/pandas-dev/pandas/issues/24698#issuecomment-614347153



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有